/*
 * 代号：凤凰
 * http://www.jphenix.org
 * 2014-06-13
 * V4.0
 */
package com.jphenix.webserver.api;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.jphenix.share.lang.SEnumeration;
import com.jphenix.standard.docs.ClassInfo;
import com.jphenix.standard.servlet.api.IFilterConfig;
import com.jphenix.standard.servlet.api.IServletContext;
import com.jphenix.standard.viewhandler.INodeHandler;
import com.jphenix.standard.viewhandler.IViewHandler;
import com.jphenix.webserver.instancea.Serve;

/**
 * 过滤器配置信息类
 * 
 * 注意：该类只读取解析web.xml中第一个过滤器的配置信息。第一个过滤器中的filter-class中定义的过滤器
 *       ，需要第三方的servlet-api包支持，所以不会去解析配置信息中的过滤器，而是直接加载内部核心过滤器
 * 
 * 2019-09-17 整理了代码格式
 * 2022-09-04 重构了内置Servlet容器，不依赖外部ServletApi包
 * 
 * @author 刘虻
 * 2008-6-29下午08:27:28
 */
@ClassInfo({"2022-09-04 21:58","过滤器配置信息类"})
public class FilterConfigImpl implements IFilterConfig {

	protected Serve              kernel      = null;            // 核心类
	private   String             filterName  = "native filter"; // 过滤器名
	private   Map<String,String> initParaMap = new HashMap<>(); // 过滤器初始化配置参数
	/**
	 * 构造函数
	 * 2008-6-29下午08:27:28
	 */
	public FilterConfigImpl(Serve serve) {
		super();
		this.kernel = serve;
		parseConfig(); // 解析过滤器配置信息
	}

	/**
	 * 覆盖方法
	 * @author 刘虻
	 * 2008-6-29下午08:27:28
	 */
	@Override
    public String getFilterName() {
		return filterName;
	}
	
	/**
	 * 设置过滤器名
	 * @author 刘虻
	 * 2008-6-29下午08:29:00
	 * @param filterName 过滤器名
	 */
	public void setFilterName(String filterName) {
		if(filterName==null) {
			return;
		}
		this.filterName = filterName;
	}

	/**
	 * 覆盖方法
	 * @author 刘虻
	 * 2008-6-29下午08:27:28
	 */
	@Override
    public String getInitParameter(String key) {
		return initParaMap.get(key);
	}

	/**
	 * 覆盖方法
	 * @author 刘虻
	 * 2008-6-29下午08:27:28
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Override
    public Enumeration<String> getInitParameterNames() {
		return new SEnumeration(initParaMap.keySet().iterator());
	}

	/**
	 * 覆盖方法
	 * @author 刘虻
	 * 2008-6-29下午08:27:28
	 */
	@Override
    public IServletContext getServletContext() {
		return kernel.getServletContext();
	}

	/**
	 * 设置初始化参数
	 */
	@Override
	public void setInitParameter(String key, String value) {
		initParaMap.put(key,value);
	}
	
	/**
	 * 解析过滤器配置信息
	 * 
	 * 2024年7月14日
	 * @author MBG
	 */
	private void parseConfig() {
		// web.xml 对象
		INodeHandler webXml     = kernel.getServeParameter().getWebXmlNode();
		// 第一个过滤器配置参数信息
		List<IViewHandler> initParaVhs = webXml.getFirstChildNodeByNodeName("filter").getChildNodesByNodeName("init-param");
		String key;   // 参数主键
		String value; // 参数值
		for(IViewHandler ele:initParaVhs) {
			key   = ele.getFirstChildNodeByNodeName("param-name").nt();
			value = ele.getFirstChildNodeByNodeName("param-value").nt();
			if(key.length()>0) {
				initParaMap.put(key,value);
			}
		}
	}
}
